import java.util.*;


public class code2 {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param grid int整型ArrayList<ArrayList<>>
     * @return int整型
     */

    public int rotApple (ArrayList<ArrayList<Integer>> grid) {
        int[] dx = {0,0,-1,1};
        int[] dy = {1,-1,0,0};
        int m = grid.size();
        int n = grid.get(0).size();
        int ret = 0;
        boolean[][] vis = new boolean[m][n];

        Queue<int[]> q = new LinkedList<>();


        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
                if(grid.get(i).get(j) == 2) {
                    q.offer(new int[]{i,j});
                }
            }
        }

        while(!q.isEmpty()) {
            int sz = q.size();
            for(int k=0;k<sz;k++) {
                //注意这个位置，一次sz只能弹一次
                int[] z = q.poll();
                for(int i=0;i<4;i++) {
                    int x = z[0] + dx[i];
                    int y = z[1] + dy[i];
                    if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && grid.get(x).get(y)==1) {
                        q.offer(new int[]{x,y});
                        vis[x][y] = true;
                    }
                }

            }
            ret++;
        }

        //看有没有未腐烂的
        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
                if(grid.get(i).get(j) == 1 && !vis[i][j]) {
                    return -1;
                }
            }
        }
        return ret-1;
    }
}